package string;

public class StringDemo {
    /**
     * String是不变对象, 对象创建后内容不可改变
     * JVM对字符串有一个优化: 常量池
     * java推荐我们使用字面量创建字符对象, 并且会将其缓存在常量池中, 当我们再次使用该字面量创建字符串时会重用对象减少内存不必要开销
     */
    public static void main(String[] args) {
        String s1 = "123abc";//java建议使用字面量创建字符串
        String s2 = new String("123abc") ;//相同字面量会重用对象
        System.out.println(s1);
        System.out.println(s2);
        System.out.println(s1==s2);//true 地址值相同证明s2使用了s1的对象//false 地址值不同证明new的新对象是在常量池里面开辟一个新空间

        String s5 = "123"+"abc";
        System.out.println(s1==s5);//true 触发预计算特性, 直接量在预计算的之后计算机可以自动识别并计算出结果, 后可以去常量池匹配

        String s = "123";
        String s6 = s+"abc";
        System.out.println(s1==s6);//false 同样的方式, 如果计算的一方是变量就不行

        s1 = s1 + "!";
        System.out.println(s1);

        System.out.println(s1 == s2);//false 变量如果改变了
    }
}
